Prekryti PaintBox

Otázka od: Ing. Jan Dvorak

17. 8. 2004 10:09

Prostredi: WXP prof., D6 SP2 prof.
Na formu mam umisteny PaintBox a nastavene Anchors na vsechny 4 strany. Na
PaintBox se vykresluji jednoduche carove grafy. Prekreslovani s
respektovanim skalovani na rozmer Canvas je provadeno pres udalost onPaint.
Pri zmene velikosti formu se grafy prekresluji spravne. Pokud je form
prekryt jinym oknem cely, pak pri jeho obnoveni je obsah PaintBox zobrazen
spravne. Pokud dojde k prekryti jen casti PaintBox jinym oknem, je po
obnoveni obsah PaintBox rekonstruovan nespravne. Pouzije se jiny vyrez
puvodniho obsahu. Pri obnoveni zobrazeni meho formu neni evokovana udalost
onPaint.
Zamenim-li PaintBox komponentou Image, obnovovani probiha ve vsech pripadech
korektne; bohuzel u Image nefunguje zmena velikosti jeho Canvas soubezne se
zmenou velicin width a height komponenty Image pri vypnutem autosize. Po
zapnuti vlastnosti autosize dochazi k prekreslovani obsahu s pouzitim
interpolace a vysledne zobrazeni je nepouzitelne.
Setkal se jiz nekdo s timto nebo podobnym chovanim a ma namet na ostraneni
popsanych nezadoucich jevu?
Jan Dvorak



Odpovedá: Petr Fiser

18. 8. 2004 10:00

Nepisete jakym zpusobem provadite vykreslovani, ale mozna to bude spatnym
vypoctem vykreslovane oblasti. Pro detekci pozadovane oblasti prekresleni je
funkce "Canvas.ClipRect" ktera vrati TRect. Pokud budete pri vypoctech
vykresleni grafu pouzivat tento "Offset" od pocatecniho bodu, musi to sedet
presne do vyrezu.

Petr Fiser.

----- Original Message -----
From: "Ing. Jan Dvorak" <dvorak@szu.cz>
To: <delphi-l@clexpert.cz>
Sent: Tuesday, August 17, 2004 11:09 AM
Subject: Prekryti PaintBox


> Prostredi: WXP prof., D6 SP2 prof.
> Na formu mam umisteny PaintBox a nastavene Anchors na vsechny 4 strany. Na
> PaintBox se vykresluji jednoduche carove grafy. Prekreslovani s
> respektovanim skalovani na rozmer Canvas je provadeno pres udalost
onPaint.
> Pri zmene velikosti formu se grafy prekresluji spravne. Pokud je form
> prekryt jinym oknem cely, pak pri jeho obnoveni je obsah PaintBox zobrazen
> spravne. Pokud dojde k prekryti jen casti PaintBox jinym oknem, je po
> obnoveni obsah PaintBox rekonstruovan nespravne. Pouzije se jiny vyrez
> puvodniho obsahu. Pri obnoveni zobrazeni meho formu neni evokovana udalost
> onPaint.
> Zamenim-li PaintBox komponentou Image, obnovovani probiha ve vsech
pripadech
> korektne; bohuzel u Image nefunguje zmena velikosti jeho Canvas soubezne
se
> zmenou velicin width a height komponenty Image pri vypnutem autosize. Po
> zapnuti vlastnosti autosize dochazi k prekreslovani obsahu s pouzitim
> interpolace a vysledne zobrazeni je nepouzitelne.
> Setkal se jiz nekdo s timto nebo podobnym chovanim a ma namet na ostraneni
> popsanych nezadoucich jevu?
> Jan Dvorak
>
>
>


Odpovedá: Ing. Jan Dvorak

18. 8. 2004 10:45

Asi jsem to popsal dosti nesrozumitelne. Pri obnoveni prekryte oblasti je
prekryty obsah nahrezen z jinych zdroju, nez je vykreslovani z meho
programu. Pokusim se popsat jak: Do obnovene casti se prekopiruje obsah
Canvas tak, ze jeho levy horni roh se objevi znovu v levem hornim rohu
zakryte oblasti. Proste jako kdyz se tam nakopiruje s offsetem. Je to asi
zalezitost Windows. Jde mi o to, jakou udalost nebo zpravu odchytit v mem
programu a vyvolat vlastni Repaint, ktery to vzdy provede spravne.
Diky predem za namety.
Jan Dvorak

Nepisete jakym zpusobem provadite vykreslovani, ale mozna to bude spatnym
vypoctem vykreslovane oblasti. Pro detekci pozadovane oblasti prekresleni je
funkce "Canvas.ClipRect" ktera vrati TRect. Pokud budete pri vypoctech
vykresleni grafu pouzivat tento "Offset" od pocatecniho bodu, musi to sedet
presne do vyrezu.

Petr Fiser.

> Prostredi: WXP prof., D6 SP2 prof.
> Na formu mam umisteny PaintBox a nastavene Anchors na vsechny 4 strany. Na
> PaintBox se vykresluji jednoduche carove grafy. Prekreslovani s
> respektovanim skalovani na rozmer Canvas je provadeno pres udalost
onPaint.



Odpovedá: Petr Fiser

18. 8. 2004 11:24

Nejlepsi bude kdyz tu cast ktera se stara o vykresleni poslete. Ja pouzivam
jednoduchy zpusob vykreslovani na TPaintBox.Canvas. Na jeho udalost OnPaint
navesim toto:

procedure TMainForm.PaintBoxPaint(Sender: TObject);
begin
  with PaintBox do
    Canvas.CopyRect(Canvas.ClipRect, TmpBmp.Canvas, Canvas.ClipRect);
end;

V te bitmape mam samozrejmne ulozeny pozadovany obraz. Muzete ji vytvorit
pokazde pri volani teto procedury, nebo ji mit vytvorenou po dobu trvani
formulare kde probiha vykreslovani (je to rychlejsi). V tomto prikladu se
vzdy namapuje presny vyrez na pozadovanem miste Canvasu. Bitmapa se musi
shodovat velikosti s velikosti PaintBoxu. Ve vasem pripade kdy potrebujete
mnenit velikost, je ale nutne vytvaret novy obrazek pri zmnene velikosti
formulare nebo komponenty na ktere je umisten PaintBox napr.:
Panel.OnResize.

procedure TMainForm.PanelResize(Sender: TObject);
begin
  //... pri kazde zmene velikosti komponenty zrusi TmpBitmap a vytvori novou
  if Assigned(TmpBmp) then
    FreeAndNil(TmpBmp);
  TmpBmp := TBitmap.Create;
  TmpBmp.Width := PainBox.Width;
  TmpBmp.Height := PaintBox.Height;
  ... a muzete kreslit
end;

Pokud budete tahat za velikost formulare jak za tahaci harmoniku, neni to
uplne optimalni reseni. V takovem pripade pouzivam casovac ktery zareaguje
az na posledni zmnenu velikosti formulare po definovanem case.

----- Original Message -----
From: "Ing. Jan Dvorak" <dvorak@szu.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, August 18, 2004 11:19 AM
Subject: Re: Prekryti PaintBox


> Asi jsem to popsal dosti nesrozumitelne. Pri obnoveni prekryte oblasti je
> prekryty obsah nahrezen z jinych zdroju, nez je vykreslovani z meho
> programu. Pokusim se popsat jak: Do obnovene casti se prekopiruje obsah
> Canvas tak, ze jeho levy horni roh se objevi znovu v levem hornim rohu
> zakryte oblasti. Proste jako kdyz se tam nakopiruje s offsetem. Je to asi
> zalezitost Windows. Jde mi o to, jakou udalost nebo zpravu odchytit v mem
> programu a vyvolat vlastni Repaint, ktery to vzdy provede spravne.
> Diky predem za namety.
> Jan Dvorak
>
> Nepisete jakym zpusobem provadite vykreslovani, ale mozna to bude spatnym
> vypoctem vykreslovane oblasti. Pro detekci pozadovane oblasti prekresleni
je
> funkce "Canvas.ClipRect" ktera vrati TRect. Pokud budete pri vypoctech
> vykresleni grafu pouzivat tento "Offset" od pocatecniho bodu, musi to
sedet
> presne do vyrezu.
>
> Petr Fiser.
>
> > Prostredi: WXP prof., D6 SP2 prof.
> > Na formu mam umisteny PaintBox a nastavene Anchors na vsechny 4 strany.
Na
> > PaintBox se vykresluji jednoduche carove grafy. Prekreslovani s
> > respektovanim skalovani na rozmer Canvas je provadeno pres udalost
> onPaint.
>
>
>